package leetcode21_30;

import org.junit.Test;

import java.util.*;

/**
 * @author shhjiang_001
 * @create 2020-06-15 14:03
 */

        /*
        给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。
        注意子串要与 words 中的单词完全匹配，中间不能有其他字符，但不需要考虑 words 中单词串联的顺序。

        示例 1：
        输入：
        s = "barfoothefoobarman",
        words = ["foo","bar"]
        输出：[0,9]
        解释：
        从索引 0 和 9 开始的子串分别是 "barfoo" 和 "foobar" 。
        输出的顺序不重要, [9,0] 也是有效答案。
        */
public class Solution30 {
    public static ArrayDeque<Integer> stack = new ArrayDeque<>();
    public static ArrayList<String> list1 = new ArrayList<>();

    public List<Integer> findSubstring(String s, String[] words) {
        List<Integer> list = new ArrayList<>();
        if(s == null || s.length() == 0 || words.length == 0 ){
            return list;
        }
        method1(words,0);
        for (int i = 0;i < list1.size();i++){
            int le = 0;
            int ri = le+words.length*words[0].length();
            while (ri <= s.length()){
                if (list1.get(i).equals(s.substring(le,  ri))){
                    list.add(le);
                }
                le++;
                ri = le+words.length*words[0].length();
            }
        }
        return list;
    }
    public void method1(String[] words,int pos){
        if (pos == words.length){
            String res = "";
            for (Integer i :stack){
                res = res+words[i];
            }
            if (!list1.contains(res)){
                list1.add(res);
            }
        }
        for (int i=0;i < words.length;i++){
            if (!stack.contains(i)){
                stack.push(i);
                method1(words,pos+1);
                stack.pop();
            }
        }
    }

    public List<Integer> findSubstring1(String s, String[] words) {
        List<Integer> res = new ArrayList<Integer>();
        int wordNum = words.length;
        if (wordNum == 0) {
            return res;
        }
        int wordLen = words[0].length();
        //HashMap1 存所有单词
        HashMap<String, Integer> allWords = new HashMap<String, Integer>();
        for (String w : words) {
            // map.getOrDefault() 如果map中有该key，就返回该key的value，如果无就返回默认值
            int value = allWords.getOrDefault(w, 0);
            // TODO 这样得到的value值是该key的数量
            allWords.put(w, value + 1);
        }
        //遍历所有子串
        for (int i = 0; i < s.length() - wordNum * wordLen + 1; i++) {
            //HashMap2 存当前扫描的字符串含有的单词
            HashMap<String, Integer> hasWords = new HashMap<String, Integer>();
            int num = 0;
            //判断该子串是否符合
            while (num < wordNum) {
                String word = s.substring(i + num * wordLen, i + (num + 1) * wordLen);
                //判断该单词在 HashMap1 中
                if (allWords.containsKey(word)) {
                    int value = hasWords.getOrDefault(word, 0);
                    hasWords.put(word, value + 1);
                    //判断当前单词的 value 和 HashMap1 中该单词的 value
                    if (hasWords.get(word) > allWords.get(word)) {
                        break;
                    }
                } else {
                    break;
                }
                num++;
            }
            //判断是不是所有的单词都符合条件
            if (num == wordNum) {
                res.add(i);
            }
        }
        return res;
    }

    @Test
    public void test() {
        Solution30 solution30 = new Solution30();
//        solution30.method1(new String[]{"ac","ef","ty"},0);
        List<Integer> list = solution30.findSubstring("aaa", new String[]{"a", "b"});
        System.out.println(list);
    }
}
